package com.hyg.publish;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * Created by huangyugen on 2018/07/17
 * “发布/订阅”模式的基础是将消息广播到所有的接收器上。
 * RabbitMQ中消息传递模型的核心思想是：生产者不直接发送消息到队列。
 * 实际的运行环境中，生产者是不知道消息会发送到那个队列上，她只会将消息发送到一个交换器，
 * 交换器也像一个生产线，她一边接收生产者发来的消息，另外一边则根据交换规则，将消息放到队列中
 *
 *
 **/
public class EmitLog {
    private static final String EXCHANGE_NAME = "logs" ;
    private static final String HOST = "192.168.1.91";

    public static void main(String[] args) throws IOException, TimeoutException {
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost(HOST);
        Connection connection = connectionFactory.newConnection();
        Channel channel = connection.createChannel();
//        交换器的规则有：
//        direct （直连）
//        topic （主题）
//        headers （标题）
//        fanout （分发）
        channel.exchangeDeclare(EXCHANGE_NAME,"fanout");//交换器的名字，type
        //分发消息
        for(int i = 0 ; i < 5; i++){
            String message = "hello world "+ i;
            //第一个参数就是交换器的名称。如果输入“”空字符串，表示使用默认的匿名交换器。
            //第二个参数是【routingKey】路由线索
            //匿名交换器规则：
            //发送到routingKey名称对应的队列
            channel.basicPublish(EXCHANGE_NAME,"",null,message.getBytes());
            System.out.println(" [x] Sent '" + message + "'");
        }
        channel.close();
        connection.close();
    }
}
